/**
 * 分页方法，处理查询、筛选及分页逻辑。
 *
 * @param {Object} params - 参数对象
 * @param {Object} params.req - 请求对象，包含查询条件和分页参数
 * @param {Function} [params.filterCallback] - 用户自定义的筛选条件处理回调，默认是一个空函数
 * @param {Object} params.model - Mongoose 模型对象，用于执行数据库查询
 *
 * @returns {Promise<Object>} - 返回分页查询结果和总数
 * @returns {number} total - 数据库中符合筛选条件的总记录数
 * @returns {Function} getPaginatedResults - 返回分页后的查询结果的函数，允许进一步链式调用
 *
 * @example
 * const result = await paging({
 *   req: request,
 *   model: UserModel,
 *   filterCallback: (filter) => {
 *     filter.status = 'enable'; // 自定义筛选条件
 *   }
 * });
 * const users1 = await result.getPaginatedResults(); // 获取分页后的数据
 * const users2 = await result.getPaginatedResults().sort({ name: 1 }); // 继续对结果排序
 * console.log(result.total); // 获取总记录数
 */

module.exports = async ({
	// prettier-ignore
	req,
	filterCallback = () => {},
	model,
}) => {
	// 获取筛选条件, 分页参数不进入条件.
	const filter = req.query;
	const { page = 1, size = 10, paging_all = false } = filter;
	delete filter.page;
	delete filter.size;
	delete filter.paging_all;
	// 回调参数:让用户可以自定义处理一遍筛选条件
	filterCallback(filter);

	// 获取总数
	const total = await model.countDocuments(filter);

	// 返回内容
	return {
		// 返回总数
		total,
		// 返回已经执行完find和分页的未执行函数, 让用户在自行练市调用其它方法
		getPaginatedResults: () => {
			return model
				.find(filter)
				.skip(paging_all ? 0 : (page - 1) * size)
				.limit(paging_all ? Number.MAX_SAFE_INTEGER : size);
		},
	};
};
